package com.jctrip.hotel.source.model.meituan.resp;

import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @Author: zxy
 * @CreateTime: 2023-12-25 15:43
 * @Description: https://developer-distribution.meituan.com/#/apiDocs/1/13/21
 */
@Data
public class GoodsRpResp implements Serializable {

    /**
     * 酒店产品详细信息列表
     */
    private List<HotelGood> hotelGoods;

    @Data
    public static class HotelGood implements Serializable {
        /**
         * 酒店ID
         */
        private Long hotelId;

        /**
         * 酒店产品信息列表
         */
        private List<Good> goods;
    }

    @Data
    public static class Good implements Serializable {
        /**
         * 酒店ID
         */
        private Long hotelId;

        /**
         * 产品ID
         */
        private Long goodsId;

        /**
         * 产品名称
         */
        private String goodsName;

        /**
         * 是否需要用户真实手机号
         * 0 不需要
         * 1 需要
         */
        private Integer needRealTel;

        /**
         * 产品类型：
         * 1 全日房
         * 2 钟点房
         */
        private Integer goodsType;

        /**
         * 确认类型：
         * 0 不支持即时确认
         * 1 支持即时确认
         */
        private Integer confirmType;

        /**
         * 是否第三方产品：
         * 0 非第三方
         * 1 第三方
         */
        private Integer thirdParty;

        /**
         * 早餐规则，多个早餐规则时需根据【规则开始结束日期】判断满足哪个规则
         */
        private List<BreakfastRule> breakfast;

        /**
         * 【逻辑房型已下线，后续只有物理房型】建议使用物理房型ID与‘查询物理房型V2(hotel.realroom.content)’接口关联，获取物理房型信息。
         */
        private List<RoomInfo> roomInfoList;

        /**
         * 取消规则
         */
        private List<CancelRule> cancelRules;

        /**
         * 礼包信息
         */
        private List<GiftInfo> gifts;

        /**
         * 预订规则，多个预订规则时需根据【规则开始结束日期】判断满足哪个规则
         */
        private List<BookRule> bookRules;

        /**
         * 发票信息
         */
        private InvoiceInfo invoiceInfo;

        /**
         * 产品价格信息列表
         */
        private List<PriceModel> priceModels;

        /**
         * 特殊活动标记，值为1表示活动有效，值为2表示活动无效。
         * 今夜特惠-LAST_MINUTE
         * 限时特惠-TIME_LIMITED_SPECIAL
         * 限量特惠-INVENTORY_LIMITED_SPECIAL
         * 假日特惠-HOLIDAY_SPECIAL
         * 产品打包-COUPON_PACKAGE
         * 包房产品-BUYOUT_INVENTORY
         * 免费房-FREE_ROOM
         * 养蜂计划-YANGFENG_PLAN
         * 自动跟价标签-AUTO_TRACE_PRICE
         * 打包产品-PACKAGE
         * 商旅优选产品-BUSINESS_PREFERRED
         * 同舟自动跟价标签-TZ_AUTO_TRACE_PRICE
         * 团队房标签-TEAM_ROOM
         * 直连活动-ZL_ACTIVE
         * 美团优选-MC
         * 占房标识-OCCUPANCY
         * 周边游-DAY_TRIP
         * 超级团购-SUPER_DEAL
         * 一键迁移-MTA_GOODS_LOSE
         * 套餐价值产品-PACKAGE_PRICE
         */
        private Map<String, Integer> goodsActivityMap;

        /**
         * 【重要】房态信息列表。备注：当请求参数中queryInfoDimensions字段包含"RS"时，此字段不为空。
         */
        private List<GoodsStatus> goodsStatuses;

        /**
         * 钟点房商家接待时段，空值表示全时段接待
         */
        private List<HourRoomReceptionTime> hourRoomReceptionTime;

        /**
         * 钟点房时间粒度，单位为分钟
         */
        private Integer timeIntervalMin;

        /**
         * 钟点房时长限制，单位为小时
         */
        private Integer timeLimitMin;

        /**
         * 产品限制规则
         */
        private String goodsLimitRule;

        /**
         * 【新增字段】支付方式 0：预付，2：现付非担保
         */
        private Integer paymentType;

        /**
         * 【新增字段（仅针对现付产品）】担保规则信息列表（注：部分非担保产品会根据到店时间来决定是否收取担保金，本期不支持收担保金流程）
         */
        private RpGuarantees rpGuarantees;

        /**
         * 是否需要身份证 true：需要，false：不需要。
         */
        private Boolean needIdentityCard;
    }

    @Data
    public static class BreakfastRule implements Serializable {
        /**
         * 早餐类型：
         * 0 不含早餐
         * 1 含有breakfastNum份免费早餐
         * 2 收费早餐
         */
        private Integer breakfastType;

        /**
         * 免费早餐数，breakfastType=1时非空
         */
        private Integer breakfastNum;

        /**
         * 早餐规则生效开始日期=inStartDate+1。如：20190209，表示该规则2019年2月10号开始生效。
         * 0-表示入住期间均可使用；
         */
        private Integer inStartDate;

        /**
         * 早餐规则生效结束日期=inEndDate+1。如：20190210，表示该规则2019年2月11号结束。
         * 0-表示入住期间均可使用；
         */
        private Integer inEndDate;
    }

    @Data
    public static class RoomInfo implements Serializable {
        /**
         * 【已废弃】逻辑房型ID。备注：同上。
         */
        private Integer roomId;

        /**
         * 【已废弃】逻辑房型名称。备注：同上。
         */
        private String roomName;

        /**
         * 城市ID
         */
        private Integer cityId;

        /**
         * 【只有物理房型】物理房型ID。
         */
        private Integer realRoomId;
    }

    @Data
    public static class CancelRule implements Serializable {
        /**
         * 取消规则：
         * 0 不可取消
         * 1 可以取消
         */
        private Integer cancelType;

        /**
         * 提前取消天数，aheadCancelDays=0表示入住当日取消。
         */
        private Integer aheadCancelDays;

        /**
         * 提前取消时间类型：
         * 0 时间
         * 1 时间量
         */
        private Integer deductType;

        /**
         * 提前取消的时间值或时间量值
         * deductType=0 格式为"HH:mm:ss", 例如: deductType=0，aheadCancelDays=0，aheadCancelHours="18:00:00",表示入住日18:00前可以取消；
         * deductType=1 格式为"数字", 例如: deductType=1，aheadCancelDays=0，aheadCancelHours=4表示入住日20:00前可以取消（提前4小时即24 - 4 = 20:00点）。
         */
        private String aheadCancelHours;
    }

    @Data
    public static class GiftInfo implements Serializable {
        /**
         * 赠送方式：
         * 3 只赠送一次
         * 4 每天赠送一次
         */
        private Integer giveType;

        /**
         * 礼包名称。
         */
        private String giftName;

        /**
         * 礼包详情描述
         */
        private String giftDesc;

        /**
         * 礼包市场价格，单位为分。
         */
        private Integer giftPrice;

        /**
         * 礼包生效规则：
         * 0 长期有效
         * 1 预订期间
         * 2 入住期间
         * 3 预订和入住期间
         */
        private Integer availableDateType;

        /**
         * 可领取礼包时间段
         */
        private List<DateRange> availableDate;

        /**
         * 礼包适用最大成人数。
         * 1、若adultMin与adultMin值一样，则说明该礼包仅适用adultMin个人（adultMax与adultMin任取一个即可）；
         * 2、若adultMin与adultMin值不一样，则说明该礼包适用adultMin - adultMax人数（1-3人）。
         */
        private String adultMax;

        /**
         * 礼包适用最小成人数。
         * 1、若adultMin与adultMin值一样，则说明该礼包仅适用adultMin个人（adultMax与adultMin任取一个即可）；
         * 2、若adultMin与adultMin值不一样，则说明该礼包适用adultMin - adultMax人数（1-3人）。
         */
        private String adultMin;

        /**
         * 儿童人数。该礼包适用2大1小使用
         */
        private String child;

        /**
         * 使用方式。如：
         * 凭确认短信直接使用，
         * 凭身份证直接使用，
         * 凭实体凭证直接使用，
         * 凭姓名直接使用，
         * 凭手机号直接使用，
         * 其他（具体文案描述）
         */
        private String entryMode;

        /**
         * 礼包类型。
         * 21 酒景
         * 22 餐饮
         * 23 酒套
         */
        private Integer giftTemplate;

        /**
         * 礼包类型为餐饮22时使用。
         * 就餐开始时间（如11:00 - 21:00）
         */
        private String mealTimeStartTime;

        /**
         * 礼包类型为餐饮22时使用。
         * 就餐结束时间（如11:00 - 21:00）
         */
        private String mealTimeEndTime;

        /**
         * 礼包类型为酒景21时使用
         * 景点名称。
         */
        private String spoiName;

        /**
         * 礼包类型为酒景21时使用
         * 景点地址。
         */
        private String saddress;
    }

    @Data
    public static class DateRange implements Serializable {
        /**
         * 领取礼包开始日期，格式为yyyy-MM-dd
         */
        private String startDate;

        /**
         * 领取礼包结束日期，格式为yyyy-MM-dd
         */
        private String endDate;
    }

    @Data
    public static class BookRule implements Serializable {
        /**
         * 连续入住最少天数，0表示不限制
         */
        private Integer serialCheckinMin;

        /**
         * 连续入住最多天数，0表示不限制
         */
        private Integer serialCheckinMax;

        /**
         * 最少预订间数，0表示不限制
         */
        private Integer roomCountMin;

        /**
         * 最多预订间数，0表示不限制
         */
        private Integer roomCountMax;

        /**
         * 最早预订天数，空值或0或-1表示不限制。
         * earliestBookingDays大于等于1，且earliestBookingHours非空，最早入住前earliestBookingDays天当天earliestBookingHours点后预订。
         * earliestBookingDays大于等于1，且earliestBookingHours为空，最早入住前earliestBookingDays天预订。
         * earliestBookingDays小于1，且earliestBookingHours非空， 最早当天earliestBookingHours点后预订。
         */
        private Integer earliestBookingDays;

        /**
         * 最早预订时间，格式为HH:mm:ss, 空值表示不限制
         */
        private String earliestBookingHours;

        /**
         * 最晚预订天数，可能取值-1,0,正数。其中0表示当天，1表示提前一天，-1表示支持凌晨预订（产品是否支持凌晨预订请参考下方isDaybreakBooking字段说明）说明：凌晨预订是指在第二天凌晨预订入住日为前一天的产品，比如20日凌晨2点预订19号入住，20号离店的产品
         */
        private Integer latestBookingDays;

        /**
         * 最晚预订时间，格式为HH:mm:ss, 空值表示不限制
         */
        private String latestBookingHours;

        /**
         * 是否支持凌晨预订
         * 1 支持，
         * 0 不支持
         * <p>
         * 说明：
         * 当且仅当latestBookingDays=-1且latestBookingHours=06:00:00且isDaybreakBooking=1时，可以判断该产品支持凌晨预订
         */
        private Integer isDaybreakBooking;

        /**
         * 限时特惠规则生效开始日期，0表示默认生效规则；如：20320209，表示该规则2032年02月09号开始生效
         */
        private Integer inStartDate;

        /**
         * 限时特惠规则生效结束日期，0表示默认生效规则；如：20210210，表示该规则2021年02月10号结束
         */
        private Integer inEndDate;
    }

    @Data
    public static class InvoiceInfo implements Serializable {
        /**
         * 发票模式：
         * 1 佣金模式 酒店开具发票，可显示文案为："如需发票,请向酒店前台索取"
         * 2 底价模式 美团开具发票
         * 3 第三方开具发票
         */
        private Integer invoiceMode;

        /**
         * 发票类型，1-普票，2-专票，0-未知
         */
        private Integer tmcInvoiceMode;
    }

    @Data
    public static class PriceModel implements Serializable {
        /**
         * 日期，格式为yyyy-MM-dd。
         */
        private String date;

        /**
         * 推荐分销商依此价格进行售卖（售卖价），单位为分。
         */
        private Integer salePrice;

        /**
         * 给分销商的佣金，单位为分。
         */
        private Integer subPrice;

        /**
         * 分销平台与分销商约定的佣金比率，取值为实际值乘以10000的结果。如佣金比率为5%，则subRatio=500。
         */
        private Integer subRatio;

        /**
         * 价日类型：
         * 0 平日
         * 1 周末
         * 2 特殊日
         */
        private Integer dayType;
    }

    @Data
    public static class GoodsStatus implements Serializable {
        /**
         * 日期，yyyy-MM-dd格式。
         */
        private String date;

        /**
         * 产品状态：0-满房，1-可预订，2-不可预订，3-不展示。
         */
        private Integer status;
    }

    @Data
    public static class HourRoomReceptionTime implements Serializable {
        /**
         * 接待开始时间，格式为HH:mm:ss。
         */
        private String startTime;

        /**
         * 接待结束时间，格式为HH:mm:ss。
         */
        private String endTime;

        /**
         * 钟点房接待时间类型：0-平日；1-周末；
         */
        private Integer type;
    }

    @Data
    public static class RpGuarantees implements Serializable {
        /**
         * 担保类型：0-非担保（目前暂不涉及），1-首晚担保，2-整单担保。
         */
        private Integer guaranteeType;

        /**
         * 担保作用时间类型：0-全部日期，1-特殊日期。
         */
        private Integer guaranteeTimeType;

        /**
         * 特殊日期时间段列表。
         */
        private List<DatePeriod> datePeriods;

        /**
         * 预计到店时间，格式为HH:mm:ss。
         */
        private String arrivalHour;
    }

    @Data
    public static class DatePeriod implements Serializable {
        /**
         * 开始日期，yyyy-MM-dd格式。
         */
        private String startDate;

        /**
         * 结束日期，yyyy-MM-dd格式。
         */
        private String endDate;
    }
}
